{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "77859301",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(page_content='一、什么是0分期利息\\n\\n您好，“0分期利息”是指买家使用花呗、招行掌上生活、工行信用卡、银联信用卡等其他分期购物时无需支付分期利息的功能，分期利息由华为商城承担。\\n\\n注：自2023年起，商城将相关宣传将“免息”调整为“0分期利息”，主要基于中国银保监会、中国人民银行《关于进一步促进信用卡业务规范健康发展的通知》（银保监规〔2022〕13号），要求“银行业金融机构应当在分期业务合同（协议）首页和业务办理页面以明显方式展示分期业务可能产生的所有息费项目、年化利率水平和息费计算方式。向客户展示分期业务收取的资金使用成本时，应当统一采用利息形式，并明确相应的计息规则，不得采用手续费等形式，法律法规另有规定的除外。”\\n\\n\\n\\n二、可以参与0分期利息活动的商品\\n\\n商城目前仅支持部分单品参与0分期利息，若多商品（含不支持0分期利息）合并支付则不支持0分期利息，以支付页面为准，后续会逐渐开放更多商品，敬请关注。\\n\\n\\n\\n三、确认订单分期成功\\n\\n订单提交成功后在支付方式页面选择分期支付，点选显示0分期利息的支付方式及具体0分期利息期数后，完成支付。\\n\\n\\n\\n\\n\\n四、订单中有多个商品，其中有商品支持0分期利息，为什么提交后却没有0分期利息？\\n\\n0分期利息商品不能和其它商品一起购买，如果和其他商品购买而不能享用0分期利息，建议取消原来的订单，重新购买时把0分期利息商品和其他商品分开单独购买；且0分期利息的分期数是固定的，如6期0分期利息，并不是3/6/12都提供0分期利息的。\\n\\n\\n\\n五、小程序是否支持0分期利息？\\n\\n华为商城小程序暂不支持0分期利息。', metadata={'source': './txt/faq-4359.txt'})]"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from langchain_community.document_loaders import TextLoader\n",
    "\n",
    "loader = TextLoader(\"./txt/faq-4359.txt\",encoding=\"utf8\")\n",
    "doc = loader.load()\n",
    "doc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "abb7db51",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_text_splitters import CharacterTextSplitter\n",
    "\n",
    "text_splitter = CharacterTextSplitter(\n",
    "    separator=\"\\n\\n\",\n",
    "    chunk_size=100,\n",
    "    chunk_overlap=10,\n",
    "    length_function=len,\n",
    "    is_separator_regex=False,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "1c30d36b",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Created a chunk of size 224, which is longer than the specified 100\n",
      "Created a chunk of size 117, which is longer than the specified 100\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Document(page_content='一、什么是0分期利息\\n\\n您好，“0分期利息”是指买家使用花呗、招行掌上生活、工行信用卡、银联信用卡等其他分期购物时无需支付分期利息的功能，分期利息由华为商城承担。'), Document(page_content='注：自2023年起，商城将相关宣传将“免息”调整为“0分期利息”，主要基于中国银保监会、中国人民银行《关于进一步促进信用卡业务规范健康发展的通知》（银保监规〔2022〕13号），要求“银行业金融机构应当在分期业务合同（协议）首页和业务办理页面以明显方式展示分期业务可能产生的所有息费项目、年化利率水平和息费计算方式。向客户展示分期业务收取的资金使用成本时，应当统一采用利息形式，并明确相应的计息规则，不得采用手续费等形式，法律法规另有规定的除外。”'), Document(page_content='二、可以参与0分期利息活动的商品\\n\\n商城目前仅支持部分单品参与0分期利息，若多商品（含不支持0分期利息）合并支付则不支持0分期利息，以支付页面为准，后续会逐渐开放更多商品，敬请关注。'), Document(page_content='三、确认订单分期成功\\n\\n订单提交成功后在支付方式页面选择分期支付，点选显示0分期利息的支付方式及具体0分期利息期数后，完成支付。'), Document(page_content='四、订单中有多个商品，其中有商品支持0分期利息，为什么提交后却没有0分期利息？'), Document(page_content='0分期利息商品不能和其它商品一起购买，如果和其他商品购买而不能享用0分期利息，建议取消原来的订单，重新购买时把0分期利息商品和其他商品分开单独购买；且0分期利息的分期数是固定的，如6期0分期利息，并不是3/6/12都提供0分期利息的。'), Document(page_content='五、小程序是否支持0分期利息？\\n\\n华为商城小程序暂不支持0分期利息。')]\n"
     ]
    }
   ],
   "source": [
    "texts = text_splitter.create_documents([doc[0].page_content])\n",
    "print(texts)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a975a355",
   "metadata": {},
   "source": [
    "## Split code 拆分代码\n",
    "\n",
    "CodeTextSplitter 允许您使用支持的多种语言拆分代码。导入枚举 Language 并指定语言。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f4084615",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_text_splitters import (\n",
    "    Language,\n",
    "    RecursiveCharacterTextSplitter,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "7bdadf17",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['cpp',\n",
       " 'go',\n",
       " 'java',\n",
       " 'kotlin',\n",
       " 'js',\n",
       " 'ts',\n",
       " 'php',\n",
       " 'proto',\n",
       " 'python',\n",
       " 'rst',\n",
       " 'ruby',\n",
       " 'rust',\n",
       " 'scala',\n",
       " 'swift',\n",
       " 'markdown',\n",
       " 'latex',\n",
       " 'html',\n",
       " 'sol',\n",
       " 'csharp',\n",
       " 'cobol',\n",
       " 'c',\n",
       " 'lua',\n",
       " 'perl']"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Full list of supported languages\n",
    "[e.value for e in Language]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "2e3e998c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['\\nfunction ',\n",
       " '\\nconst ',\n",
       " '\\nlet ',\n",
       " '\\nvar ',\n",
       " '\\nclass ',\n",
       " '\\nif ',\n",
       " '\\nfor ',\n",
       " '\\nwhile ',\n",
       " '\\nswitch ',\n",
       " '\\ncase ',\n",
       " '\\ndefault ',\n",
       " '\\n\\n',\n",
       " '\\n',\n",
       " ' ',\n",
       " '']"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "RecursiveCharacterTextSplitter.get_separators_for_language(Language.JS)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "2c02f71a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(page_content='// 导入threejs\\nimport * as THREE from \"three\";\\n// 导入轨道控制器\\nimport { OrbitControls } from \"three/examples/jsm/controls/OrbitControls.js\";\\n// 导入lil.gui\\nimport { GUI } from \"three/examples/jsm/libs/lil-gui.module.min.js\";\\n// 导入hdr加载器\\nimport { RGBELoader } from \"three/examples/jsm/loaders/RGBELoader.js\";\\n// 导入gltf加载器\\nimport { GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\\n// 导入draco解码器\\nimport { DRACOLoader } from \"three/examples/jsm/loaders/DRACOLoader.js\";\\nimport { CSS3DRenderer,CSS3DObject } from \\'three/addons/renderers/CSS3DRenderer.js\\';\\n\\n// 创建场景\\nconst scene = new THREE.Scene();\\n\\n// 创建相机\\nconst camera = new THREE.PerspectiveCamera(\\n  45, // 视角\\n  window.innerWidth / window.innerHeight, // 宽高比\\n  1, // 近平面\\n  10000 // 远平面\\n);\\n\\n// 创建渲染器\\nconst renderer = new THREE.WebGLRenderer({\\n  antialias: true, // 开启抗锯齿\\n});\\nrenderer.shadowMap.enabled = true;\\nrenderer.toneMapping = THREE.ReinhardToneMapping;\\nrenderer.toneMappingExposure = 1;\\nrenderer.setSize(window.innerWidth, window.innerHeight);\\ndocument.querySelector(\\'#webgl\\').appendChild(renderer.domElement);\\n\\n// css3drenderer\\nconst css3drenderer = new CSS3DRenderer();\\ncss3drenderer.setSize( window.innerWidth, window.innerHeight );\\ndocument.querySelector( \\'#css\\' ).appendChild( css3drenderer.domElement );\\n\\n\\n// 设置相机位置\\ncamera.position.z = 800;\\ncamera.position.y = 250;\\ncamera.position.x = 300;\\ncamera.lookAt(0, 0, 0);\\n\\n// 添加世界坐标辅助器\\nconst axesHelper = new THREE.AxesHelper(500);\\nscene.add(axesHelper);\\n\\n\\n\\n// 添加轨道控制器\\nconst controls = new OrbitControls(camera, renderer.domElement);\\n// 设置带阻尼的惯性\\ncontrols.enableDamping = true;\\n\\nlet clock = new THREE.Clock();\\n\\nfunction animate() {\\n  let delta = clock.getDelta();\\n  controls.update();\\n  \\n\\n  requestAnimationFrame(animate);\\n  // 渲染\\n  renderer.render(scene, camera);\\n  css3drenderer.render(scene, camera);\\n}\\n\\n\\n// 监听窗口变化\\nwindow.addEventListener(\"resize\", () => {\\n  // 重置渲染器宽高比\\n  renderer.setSize(window.innerWidth, window.innerHeight);\\n  // 重置相机宽高比\\n  camera.aspect = window.innerWidth / window.innerHeight;\\n  // 更新相机投影矩阵\\n  camera.updateProjectionMatrix();\\n});\\n\\n// rgbeLoader 加载hdr贴图\\nlet rgbeLoader = new RGBELoader();\\nrgbeLoader.load(\"./texture/Alex_Hart-Nature_Lab_Bones_2k.hdr\", (envMap) => {\\n  // 设置球形贴图\\n  // envMap.mapping = THREE.EquirectangularReflectionMapping;\\n  envMap.mapping = THREE.EquirectangularRefractionMapping;\\n  // 设置环境贴图\\n  // scene.background = envMap;\\n  scene.background = new THREE.Color(0xffffff);\\n  // 设置环境贴图\\n  scene.environment = envMap;\\n});\\n// rgbeLoader 加载hdr贴图\\n// 实例化加载器gltf\\nconst gltfLoader = new GLTFLoader();\\n// 实例化加载器draco\\nconst dracoLoader = new DRACOLoader();\\n// 设置draco路径\\ndracoLoader.setDecoderPath(\"./draco/\");\\n// 设置gltf加载器draco解码器\\ngltfLoader.setDRACOLoader(dracoLoader);\\n\\n// 加载模型\\ngltfLoader.load(\\n  // 模型路径\\n  \"./model/hilda_regular_00.glb\",\\n  // 加载完成回调\\n  (gltf) => {\\n    // scene.add(gltf.scene);\\n  }\\n);\\n\\n// 创建GUI\\nconst gui = new GUI();\\n\\n\\n// 创建1个半径为100的球体\\nconst sphere = new THREE.Mesh(\\n  new THREE.SphereGeometry(40, 64, 64),\\n  new THREE.MeshStandardMaterial({\\n    color: 0x33ffff,\\n  })\\n)\\nsphere.castShadow = true\\nsphere.receiveShadow = true\\nscene.add(sphere);\\n\\nconst obj = new THREE.Object3D()\\n\\n// 创建1个宽高为200px的div\\nconst div = document.createElement(\"div\");\\ndiv.style.width = \"200px\";\\ndiv.style.height = \"200px\";\\ndiv.style.backgroundColor = \"rgba(0, 0, 255, 0.5)\";\\ndiv.style.padding = \"20px\";\\ndiv.style.color = \"white\";\\ndiv.style.boxSizing = \"border-box\";\\ndiv.innerHTML = \"Hello, 3D!\";\\n\\n\\n\\n// 创建1个css3object\\nconst css3dobject = new CSS3DObject(div);\\nobj.add(css3dobject);\\n\\n// 创建一个threejs里的平面跟css3d的div重合，进行挖洞\\nvar material = new THREE.MeshStandardMaterial({\\n  opacity:0.5,\\n  color:new THREE.Color(0x111111),\\n  blending:THREE.NoBlending,\\n})\\nvar geometry = new THREE.BoxGeometry(200,200,1)\\nvar mesh = new THREE.Mesh(geometry,material)\\nmesh.castShadow = true\\nmesh.receiveShadow = true\\n\\nobj.add(mesh)\\nscene.add(obj)\\n\\n// 添加平行光\\nconst light = new THREE.DirectionalLight(0xffffff, 100);\\n\\nlight.position.set(500, 200, 200);\\nlight.castShadow = true;\\nscene.add(light);\\nlight.shadow.camera.near = 1;\\nlight.shadow.camera.far = 1000;\\nlight.shadow.camera.left = -200;\\nlight.shadow.camera.right = 200;\\nlight.shadow.camera.top = 200;\\nlight.shadow.camera.bottom = -200;\\n\\n\\n\\n\\nanimate();\\n', metadata={'source': './js/main.js'})]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "loader = TextLoader(\"./js/main.js\",encoding=\"utf8\")\n",
    "doc = loader.load()\n",
    "doc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "2642e095",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(page_content='// 导入threejs\\nimport * as THREE from \"three\";\\n// 导入轨道控制器\\nimport { OrbitControls } from \"three/examples/jsm/controls/OrbitControls.js\";\\n// 导入lil.gui\\nimport { GUI } from \"three/examples/jsm/libs/lil-gui.module.min.js\";\\n// 导入hdr加载器'),\n",
       " Document(page_content='// 导入hdr加载器\\nimport { RGBELoader } from \"three/examples/jsm/loaders/RGBELoader.js\";\\n// 导入gltf加载器\\nimport { GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\\n// 导入draco解码器'),\n",
       " Document(page_content='// 导入draco解码器\\nimport { DRACOLoader } from \"three/examples/jsm/loaders/DRACOLoader.js\";\\nimport { CSS3DRenderer,CSS3DObject } from \\'three/addons/renderers/CSS3DRenderer.js\\';'),\n",
       " Document(page_content='// 创建场景'),\n",
       " Document(page_content='const scene = new THREE.Scene();\\n\\n// 创建相机\\nconst camera = new THREE.PerspectiveCamera(\\n  45, // 视角\\n  window.innerWidth / window.innerHeight, // 宽高比\\n  1, // 近平面\\n  10000 // 远平面\\n);\\n\\n// 创建渲染器'),\n",
       " Document(page_content='const renderer = new THREE.WebGLRenderer({\\n  antialias: true, // 开启抗锯齿\\n});\\nrenderer.shadowMap.enabled = true;\\nrenderer.toneMapping = THREE.ReinhardToneMapping;\\nrenderer.toneMappingExposure = 1;'),\n",
       " Document(page_content=\"renderer.setSize(window.innerWidth, window.innerHeight);\\ndocument.querySelector('#webgl').appendChild(renderer.domElement);\"),\n",
       " Document(page_content='// css3drenderer'),\n",
       " Document(page_content=\"const css3drenderer = new CSS3DRenderer();\\ncss3drenderer.setSize( window.innerWidth, window.innerHeight );\\ndocument.querySelector( '#css' ).appendChild( css3drenderer.domElement );\"),\n",
       " Document(page_content='// 设置相机位置\\ncamera.position.z = 800;\\ncamera.position.y = 250;\\ncamera.position.x = 300;\\ncamera.lookAt(0, 0, 0);\\n\\n// 添加世界坐标辅助器'),\n",
       " Document(page_content='const axesHelper = new THREE.AxesHelper(500);\\nscene.add(axesHelper);\\n\\n\\n\\n// 添加轨道控制器\\nconst controls = new OrbitControls(camera, renderer.domElement);\\n// 设置带阻尼的惯性\\ncontrols.enableDamping = true;\\n\\nlet clock = new THREE.Clock();'),\n",
       " Document(page_content='function animate() {\\n  let delta = clock.getDelta();\\n  controls.update();\\n  \\n\\n  requestAnimationFrame(animate);\\n  // 渲染\\n  renderer.render(scene, camera);\\n  css3drenderer.render(scene, camera);\\n}'),\n",
       " Document(page_content='// 监听窗口变化\\nwindow.addEventListener(\"resize\", () => {\\n  // 重置渲染器宽高比\\n  renderer.setSize(window.innerWidth, window.innerHeight);\\n  // 重置相机宽高比\\n  camera.aspect = window.innerWidth / window.innerHeight;\\n  // 更新相机投影矩阵\\n  camera.updateProjectionMatrix();'),\n",
       " Document(page_content='});'),\n",
       " Document(page_content='// rgbeLoader 加载hdr贴图'),\n",
       " Document(page_content='let rgbeLoader = new RGBELoader();\\nrgbeLoader.load(\"./texture/Alex_Hart-Nature_Lab_Bones_2k.hdr\", (envMap) => {\\n  // 设置球形贴图\\n  // envMap.mapping = THREE.EquirectangularReflectionMapping;\\n  envMap.mapping = THREE.EquirectangularRefractionMapping;'),\n",
       " Document(page_content='// 设置环境贴图\\n  // scene.background = envMap;\\n  scene.background = new THREE.Color(0xffffff);\\n  // 设置环境贴图\\n  scene.environment = envMap;\\n});\\n// rgbeLoader 加载hdr贴图\\n// 实例化加载器gltf'),\n",
       " Document(page_content='const gltfLoader = new GLTFLoader();\\n// 实例化加载器draco'),\n",
       " Document(page_content='const dracoLoader = new DRACOLoader();\\n// 设置draco路径\\ndracoLoader.setDecoderPath(\"./draco/\");\\n// 设置gltf加载器draco解码器\\ngltfLoader.setDRACOLoader(dracoLoader);'),\n",
       " Document(page_content='// 加载模型\\ngltfLoader.load(\\n  // 模型路径\\n  \"./model/hilda_regular_00.glb\",\\n  // 加载完成回调\\n  (gltf) => {\\n    // scene.add(gltf.scene);\\n  }\\n);\\n\\n// 创建GUI'),\n",
       " Document(page_content='const gui = new GUI();\\n\\n\\n// 创建1个半径为100的球体\\nconst sphere = new THREE.Mesh(\\n  new THREE.SphereGeometry(40, 64, 64),\\n  new THREE.MeshStandardMaterial({\\n    color: 0x33ffff,\\n  })\\n)\\nsphere.castShadow = true\\nsphere.receiveShadow = true\\nscene.add(sphere);'),\n",
       " Document(page_content='const obj = new THREE.Object3D()\\n\\n// 创建1个宽高为200px的div'),\n",
       " Document(page_content='const div = document.createElement(\"div\");\\ndiv.style.width = \"200px\";\\ndiv.style.height = \"200px\";\\ndiv.style.backgroundColor = \"rgba(0, 0, 255, 0.5)\";\\ndiv.style.padding = \"20px\";\\ndiv.style.color = \"white\";\\ndiv.style.boxSizing = \"border-box\";'),\n",
       " Document(page_content='div.innerHTML = \"Hello, 3D!\";'),\n",
       " Document(page_content='// 创建1个css3object'),\n",
       " Document(page_content='const css3dobject = new CSS3DObject(div);\\nobj.add(css3dobject);\\n\\n// 创建一个threejs里的平面跟css3d的div重合，进行挖洞\\nvar material = new THREE.MeshStandardMaterial({\\n  opacity:0.5,\\n  color:new THREE.Color(0x111111),\\n  blending:THREE.NoBlending,\\n})'),\n",
       " Document(page_content='var geometry = new THREE.BoxGeometry(200,200,1)\\nvar mesh = new THREE.Mesh(geometry,material)\\nmesh.castShadow = true\\nmesh.receiveShadow = true\\n\\nobj.add(mesh)\\nscene.add(obj)\\n\\n// 添加平行光'),\n",
       " Document(page_content='const light = new THREE.DirectionalLight(0xffffff, 100);'),\n",
       " Document(page_content='light.position.set(500, 200, 200);\\nlight.castShadow = true;\\nscene.add(light);\\nlight.shadow.camera.near = 1;\\nlight.shadow.camera.far = 1000;\\nlight.shadow.camera.left = -200;\\nlight.shadow.camera.right = 200;\\nlight.shadow.camera.top = 200;'),\n",
       " Document(page_content='light.shadow.camera.bottom = -200;'),\n",
       " Document(page_content='animate();')]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "js_splitter = RecursiveCharacterTextSplitter.from_language(\n",
    "    language=Language.JS, chunk_size=250, chunk_overlap=20\n",
    ")\n",
    "js_docs = js_splitter.create_documents([doc[0].page_content])\n",
    "js_docs"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "75ffb8a9",
   "metadata": {},
   "source": [
    "## Markdown文本分割器\n",
    "\n",
    "许多聊天或问答应用程序都涉及在嵌入和矢量存储之前对输入文档进行分块。\n",
    "\n",
    "如前所述，分块通常旨在将具有共同上下文的文本放在一起。考虑到这一点，我们可能希望特别尊重文档本身的结构。例如，Markdown 文件是按标题组织的。在特定标头组中创建块是一个直观的想法。为了解决这个挑战，我们可以使用 MarkdownHeaderTextSplitter 。这将按一组指定的标头拆分 Markdown 文件。\n",
    "\n",
    "例如，如果我们想分割这个 markdown：\n",
    "\n",
    "```\n",
    "# Foo\n",
    "## Bar\n",
    "Hi this is Jim  \n",
    "\n",
    "Hi this is Joe\n",
    "\n",
    "## Baz\n",
    "Hi this is Molly\n",
    "```\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "f48e5b91",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_text_splitters import MarkdownHeaderTextSplitter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e3fa6047",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(page_content='# stable diffusion 控制光照的 3 种方法\\n\\n在摄影中，光线是一切的基础，它对图像的质量和情感具有重大影响。通过运用灯光，我们可以提升主题的鲜明度、拓展画面的深度和维度、传递情感以及突出关键细节。\\n\\n本文将为您详细介绍控制照明的技巧与方法。掌握控制照明的技巧，能够使我们在摄影中更加灵活地运用灯光，提升画面的质量和艺术效果。\\n\\n常用的有三种方式：\\n\\n1. 照明关键词\\n2. 区域提示\\n3. ControlNet\\n\\n## 使用照明关键字\\n\\n最简单的方法是在提示中添加照明关键字。\\n提示词\\n```\\n1girl,shoot,street photo,realistic\\n```\\n否定提示词：\\n```\\ndisfigured, ugly, bad, immature, cartoon, anime, 3d, painting, b&w, nsfw\\n```\\n我将使用下面的基本提示和否定提示来说明效果。\\n\\n```\\nModel: realbeautymix_v15.safetensors [9b7a37da79]\\nWidth: 512\\nHeight: 768\\nCFG scale: 7\\nSeed: 1237221082\\n```\\n\\n使用基本提示生成的示例图像。它们光线充足且美观，但灯光却乏味。\\n\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688484664380-7532991a-1cfa-4c9e-845a-b1b0b3782de0.png)\\n\\n\\n### 体积照明\\n\\n体积照明是图像上不同的光束。用于摄影中以增加体积感。\\n\\n将关键字`Volumetric lighting`添加到提示中：\\n![体积光](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688485004930-9ab838cc-2f01-4113-a8ef-62cb5aa579bd.png \"体积光\")\\n\\n\\n### 边缘照明\\n\\n边缘照明为拍摄对象增添了明亮的轮廓。它可能会使拍摄对象变暗。您可以结合其他照明术语来照亮拍摄对象。\\n```\\n1girl,shoot,street photo,realistic,(rim lighting:1.8)\\n```\\n\\n将关键字`rim lighting`添加到提示中\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688485673884-72528b2c-8edf-43e6-a85f-0e4da1b80e0b.png)\\n\\n### 阳光\\n\\n为图像添加阳光。它倾向于渲染自然背景。\\n\\n将关键字`sunlight`添加到提示中。\\n```\\n1girl,shoot,street photo,realistic,(sunlight:1.2),\\n```\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688486018911-402937b9-72cf-45d2-ae9b-651d227028d4.png)\\n\\n\\n\\n\\n\\n### 背光\\n\\n背光将光源置于拍摄对象后面。通过添加这一关键字，您可以产生一些时尚的效果。\\n\\n为提示添加`backlight`。\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688487740537-9c742673-5aab-4708-bf4b-1147d9585559.png)\\n\\n\\n\\n\\n### 暗光\\n\\n众所周知，稳定扩散不会在无引导的情况下产生暗图像。有很多方法可以解决这个问题，包括使用模型和 LoRA。但更简单的方法是添加一些暗光关键字。\\n\\n在提示中添加`dimly lit`\\n\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688488856656-c59b4bb6-2cd6-4dd7-be0a-c1aad71a22e8.png)\\n\\n\\n### 暮光\\n\\n暮光增加了穿透云层的光线。它可以创造令人惊叹的视觉效果。\\n\\n这种提示和肖像长宽比通常会渲染全身图像。添加`crepuscular rays`\\n\\n\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688489535509-0e7c3720-1ac9-4914-a07b-b4ac2908982c.png)\\n\\n\\n### 注意事项\\n\\n1. 若未见明显效果，可调整关键字权重。\\n2. 这些照明关键词并非绝对有效。请尝试生成几张图像。\\n3. 在提示生成器中搜索更多照明关键词。\\n\\n## 控制区域照明\\n\\n提示中的照明关键字适用于整个图像。您可以进一步将灯光效果拨入图像的特定区域。\\n\\n### 安装区域提示词扩展\\n\\n您将需要区域提示器扩展。\\n按照以下步骤在 AUTOMATIC1111 中安装区域提示器扩展。\\n\\n1. 正常启动 AUTOMATIC1111 Web-UI。\\n2. 导航到扩展页面。\\n3. 单击可用选项卡。\\n4. 单击加载自：按钮。\\n5. 找到扩展名“Regional Prompter”。\\n6. 单击安装。\\n7. 重新启动网络用户界面。\\n\\n在此示例中，您将对图像的上部和下部应用不同的照明。\\n\\n在 txt2img 页面中，展开区域提示符部分。\\n\\n```\\nActive: Yes\\nUse common prompt: Yes\\nSplit mode: Vertical\\nDivide Ratio: 2,3\\n```\\n单击“可视化并制作模板”以确认图像被分成两个垂直区域。\\n\\n输入提示\\n```\\n```\\n否定提示：\\n```\\n```\\n所有其他参数保持不变。\\n\\n您将得到一些顶部明亮但底部较暗的图像。\\n\\n现在尝试交换照明分配\\n```\\n```\\n灯光也会相应地交换。\\n\\n\\n###  ControlNet 控制灯光\\n如今，任何教程如果不提及 ControlNet 都是不完整的……所以就开始吧！\\n\\n这种方法可以让您精确控制照明。\\n\\n您将需要安装 ControlNet 扩展。按照本教程进行安装。\\n\\n### TXT2IMG设置\\n1. 在txt2img页面上，照常生成图像。\\n\\n\\n2. 选择要添加光照的图像。\\n\\n3. 将其保存到本地存储（稍后我们将在 ControlNet 中需要它）。\\n\\n4. 按发送到 img2img。\\n\\n5. Img2img 设置\\n您的提示、否定提示、图像大小和种子值现已移植到 img2img 页面。\\n\\n在img2img页面上，导航至 ControlNet 部分。\\n\\n将刚刚保存的图像上传到ControlNet Unit 0\\n\\n使用以下设置\\n```\\nEnable: Yes\\nPixel Perfect: Yes\\nAllow preview: Yes\\nControl Type: Depth\\nPreprocessor: depth_zoe\\nModel: control_xxxx_depth\\nControl Weight: 0.6\\n```\\n\\n6. 向上滚动到img2img 画布。删除图像。\\n\\n我们将使用下图来控制照明。该图像指定顶部附近的聚光灯。\\n\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688481176506-90720858-4e41-4c83-b66b-d0b0786d9d06.png)\\n\\n调整亮度模式为“仅调整亮度”。\\n\\n将对比度强度设置为 0.95。\\n\\n点击“生成”按钮。\\n\\n预计您将获得一张顶部的光照图像。\\n\\n\\n\\n单击铅笔图标后，拖动突出显示区域的一角以调整大小。目前该工具存在一个错误。您可能需要执行两次。\\n\\n例如，下面的屏幕截图显示相同的图像被裁剪，以便光源位于左上角。\\n看到脸部和帽子的左侧比上一张图片亮得更多。\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688481326495-b94e172f-6487-4700-824e-f9ef694fab75.png)\\n\\n同样，使用下面的光源从左下角照亮图像。\\n\\n\\n\\n或者更高对比度的对角光。\\n\\n\\n\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688481334968-576bf15d-0896-41c8-aadc-198a87576eea.png)\\n\\n## 注意事项\\n1. 如果您发现Cotrolnet显示的颜色异常，请尝试减小其权重。\\n2. 调整去噪等级并观察相应的效果。\\n', metadata={'source': './txt/stable_diffusion.md'})]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "loader = TextLoader(\"./txt/stable_diffusion.md\",encoding=\"utf8\")\n",
    "doc = loader.load()\n",
    "doc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "2c79e90c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(page_content='在摄影中，光线是一切的基础，它对图像的质量和情感具有重大影响。通过运用灯光，我们可以提升主题的鲜明度、拓展画面的深度和维度、传递情感以及突出关键细节。  \\n本文将为您详细介绍控制照明的技巧与方法。掌握控制照明的技巧，能够使我们在摄影中更加灵活地运用灯光，提升画面的质量和艺术效果。  \\n常用的有三种方式：  \\n1. 照明关键词\\n2. 区域提示\\n3. ControlNet', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法'}),\n",
       " Document(page_content='最简单的方法是在提示中添加照明关键字。\\n提示词\\n```\\n1girl,shoot,street photo,realistic\\n```\\n否定提示词：\\n```\\ndisfigured, ugly, bad, immature, cartoon, anime, 3d, painting, b&w, nsfw\\n```\\n我将使用下面的基本提示和否定提示来说明效果。  \\n```\\nModel: realbeautymix_v15.safetensors [9b7a37da79]\\nWidth: 512\\nHeight: 768\\nCFG scale: 7\\nSeed: 1237221082\\n```  \\n使用基本提示生成的示例图像。它们光线充足且美观，但灯光却乏味。  \\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688484664380-7532991a-1cfa-4c9e-845a-b1b0b3782de0.png)', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字'}),\n",
       " Document(page_content='体积照明是图像上不同的光束。用于摄影中以增加体积感。  \\n将关键字`Volumetric lighting`添加到提示中：\\n![体积光](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688485004930-9ab838cc-2f01-4113-a8ef-62cb5aa579bd.png \"体积光\")', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字', 'Header 3': '体积照明'}),\n",
       " Document(page_content='边缘照明为拍摄对象增添了明亮的轮廓。它可能会使拍摄对象变暗。您可以结合其他照明术语来照亮拍摄对象。\\n```\\n1girl,shoot,street photo,realistic,(rim lighting:1.8)\\n```  \\n将关键字`rim lighting`添加到提示中\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688485673884-72528b2c-8edf-43e6-a85f-0e4da1b80e0b.png)', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字', 'Header 3': '边缘照明'}),\n",
       " Document(page_content='为图像添加阳光。它倾向于渲染自然背景。  \\n将关键字`sunlight`添加到提示中。\\n```\\n1girl,shoot,street photo,realistic,(sunlight:1.2),\\n```\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688486018911-402937b9-72cf-45d2-ae9b-651d227028d4.png)', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字', 'Header 3': '阳光'}),\n",
       " Document(page_content='背光将光源置于拍摄对象后面。通过添加这一关键字，您可以产生一些时尚的效果。  \\n为提示添加`backlight`。\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688487740537-9c742673-5aab-4708-bf4b-1147d9585559.png)', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字', 'Header 3': '背光'}),\n",
       " Document(page_content='众所周知，稳定扩散不会在无引导的情况下产生暗图像。有很多方法可以解决这个问题，包括使用模型和 LoRA。但更简单的方法是添加一些暗光关键字。  \\n在提示中添加`dimly lit`  \\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688488856656-c59b4bb6-2cd6-4dd7-be0a-c1aad71a22e8.png)', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字', 'Header 3': '暗光'}),\n",
       " Document(page_content='暮光增加了穿透云层的光线。它可以创造令人惊叹的视觉效果。  \\n这种提示和肖像长宽比通常会渲染全身图像。添加`crepuscular rays`  \\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688489535509-0e7c3720-1ac9-4914-a07b-b4ac2908982c.png)', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字', 'Header 3': '暮光'}),\n",
       " Document(page_content='1. 若未见明显效果，可调整关键字权重。\\n2. 这些照明关键词并非绝对有效。请尝试生成几张图像。\\n3. 在提示生成器中搜索更多照明关键词。', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字', 'Header 3': '注意事项'}),\n",
       " Document(page_content='提示中的照明关键字适用于整个图像。您可以进一步将灯光效果拨入图像的特定区域。', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '控制区域照明'}),\n",
       " Document(page_content='您将需要区域提示器扩展。\\n按照以下步骤在 AUTOMATIC1111 中安装区域提示器扩展。  \\n1. 正常启动 AUTOMATIC1111 Web-UI。\\n2. 导航到扩展页面。\\n3. 单击可用选项卡。\\n4. 单击加载自：按钮。\\n5. 找到扩展名“Regional Prompter”。\\n6. 单击安装。\\n7. 重新启动网络用户界面。  \\n在此示例中，您将对图像的上部和下部应用不同的照明。  \\n在 txt2img 页面中，展开区域提示符部分。  \\n```\\nActive: Yes\\nUse common prompt: Yes\\nSplit mode: Vertical\\nDivide Ratio: 2,3\\n```\\n单击“可视化并制作模板”以确认图像被分成两个垂直区域。  \\n输入提示\\n```\\n```\\n否定提示：\\n```\\n```\\n所有其他参数保持不变。  \\n您将得到一些顶部明亮但底部较暗的图像。  \\n现在尝试交换照明分配\\n```\\n```\\n灯光也会相应地交换。', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '控制区域照明', 'Header 3': '安装区域提示词扩展'}),\n",
       " Document(page_content='如今，任何教程如果不提及 ControlNet 都是不完整的……所以就开始吧！  \\n这种方法可以让您精确控制照明。  \\n您将需要安装 ControlNet 扩展。按照本教程进行安装。', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '控制区域照明', 'Header 3': 'ControlNet 控制灯光'}),\n",
       " Document(page_content='1. 在txt2img页面上，照常生成图像。  \\n2. 选择要添加光照的图像。  \\n3. 将其保存到本地存储（稍后我们将在 ControlNet 中需要它）。  \\n4. 按发送到 img2img。  \\n5. Img2img 设置\\n您的提示、否定提示、图像大小和种子值现已移植到 img2img 页面。  \\n在img2img页面上，导航至 ControlNet 部分。  \\n将刚刚保存的图像上传到ControlNet Unit 0  \\n使用以下设置\\n```\\nEnable: Yes\\nPixel Perfect: Yes\\nAllow preview: Yes\\nControl Type: Depth\\nPreprocessor: depth_zoe\\nModel: control_xxxx_depth\\nControl Weight: 0.6\\n```  \\n6. 向上滚动到img2img 画布。删除图像。  \\n我们将使用下图来控制照明。该图像指定顶部附近的聚光灯。  \\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688481176506-90720858-4e41-4c83-b66b-d0b0786d9d06.png)  \\n调整亮度模式为“仅调整亮度”。  \\n将对比度强度设置为 0.95。  \\n点击“生成”按钮。  \\n预计您将获得一张顶部的光照图像。  \\n单击铅笔图标后，拖动突出显示区域的一角以调整大小。目前该工具存在一个错误。您可能需要执行两次。  \\n例如，下面的屏幕截图显示相同的图像被裁剪，以便光源位于左上角。\\n看到脸部和帽子的左侧比上一张图片亮得更多。\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688481326495-b94e172f-6487-4700-824e-f9ef694fab75.png)  \\n同样，使用下面的光源从左下角照亮图像。  \\n或者更高对比度的对角光。  \\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688481334968-576bf15d-0896-41c8-aadc-198a87576eea.png)', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '控制区域照明', 'Header 3': 'TXT2IMG设置'}),\n",
       " Document(page_content='1. 如果您发现Cotrolnet显示的颜色异常，请尝试减小其权重。\\n2. 调整去噪等级并观察相应的效果。', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '注意事项'})]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "headers_to_split_on = [\n",
    "    (\"#\", \"Header 1\"),\n",
    "    (\"##\", \"Header 2\"),\n",
    "    (\"###\", \"Header 3\"),\n",
    "]\n",
    "\n",
    "markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)\n",
    "md_header_splits = markdown_splitter.split_text(doc[0].page_content)\n",
    "md_header_splits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "7b0e4534",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(page_content='# stable diffusion 控制光照的 3 种方法  \\n在摄影中，光线是一切的基础，它对图像的质量和情感具有重大影响。通过运用灯光，我们可以提升主题的鲜明度、拓展画面的深度和维度、传递情感以及突出关键细节。  \\n本文将为您详细介绍控制照明的技巧与方法。掌握控制照明的技巧，能够使我们在摄影中更加灵活地运用灯光，提升画面的质量和艺术效果。  \\n常用的有三种方式：  \\n1. 照明关键词\\n2. 区域提示\\n3. ControlNet', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法'}),\n",
       " Document(page_content='## 使用照明关键字  \\n最简单的方法是在提示中添加照明关键字。\\n提示词\\n```\\n1girl,shoot,street photo,realistic\\n```\\n否定提示词：\\n```\\ndisfigured, ugly, bad, immature, cartoon, anime, 3d, painting, b&w, nsfw\\n```\\n我将使用下面的基本提示和否定提示来说明效果。  \\n```\\nModel: realbeautymix_v15.safetensors [9b7a37da79]\\nWidth: 512\\nHeight: 768\\nCFG scale: 7\\nSeed: 1237221082\\n```  \\n使用基本提示生成的示例图像。它们光线充足且美观，但灯光却乏味。  \\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688484664380-7532991a-1cfa-4c9e-845a-b1b0b3782de0.png)', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字'}),\n",
       " Document(page_content='### 体积照明  \\n体积照明是图像上不同的光束。用于摄影中以增加体积感。  \\n将关键字`Volumetric lighting`添加到提示中：\\n![体积光](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688485004930-9ab838cc-2f01-4113-a8ef-62cb5aa579bd.png \"体积光\")', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字', 'Header 3': '体积照明'}),\n",
       " Document(page_content='### 边缘照明  \\n边缘照明为拍摄对象增添了明亮的轮廓。它可能会使拍摄对象变暗。您可以结合其他照明术语来照亮拍摄对象。\\n```\\n1girl,shoot,street photo,realistic,(rim lighting:1.8)\\n```  \\n将关键字`rim lighting`添加到提示中\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688485673884-72528b2c-8edf-43e6-a85f-0e4da1b80e0b.png)', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字', 'Header 3': '边缘照明'}),\n",
       " Document(page_content='### 阳光  \\n为图像添加阳光。它倾向于渲染自然背景。  \\n将关键字`sunlight`添加到提示中。\\n```\\n1girl,shoot,street photo,realistic,(sunlight:1.2),\\n```\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688486018911-402937b9-72cf-45d2-ae9b-651d227028d4.png)', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字', 'Header 3': '阳光'}),\n",
       " Document(page_content='### 背光  \\n背光将光源置于拍摄对象后面。通过添加这一关键字，您可以产生一些时尚的效果。  \\n为提示添加`backlight`。\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688487740537-9c742673-5aab-4708-bf4b-1147d9585559.png)', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字', 'Header 3': '背光'}),\n",
       " Document(page_content='### 暗光  \\n众所周知，稳定扩散不会在无引导的情况下产生暗图像。有很多方法可以解决这个问题，包括使用模型和 LoRA。但更简单的方法是添加一些暗光关键字。  \\n在提示中添加`dimly lit`  \\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688488856656-c59b4bb6-2cd6-4dd7-be0a-c1aad71a22e8.png)', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字', 'Header 3': '暗光'}),\n",
       " Document(page_content='### 暮光  \\n暮光增加了穿透云层的光线。它可以创造令人惊叹的视觉效果。  \\n这种提示和肖像长宽比通常会渲染全身图像。添加`crepuscular rays`  \\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688489535509-0e7c3720-1ac9-4914-a07b-b4ac2908982c.png)', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字', 'Header 3': '暮光'}),\n",
       " Document(page_content='### 注意事项  \\n1. 若未见明显效果，可调整关键字权重。\\n2. 这些照明关键词并非绝对有效。请尝试生成几张图像。\\n3. 在提示生成器中搜索更多照明关键词。', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '使用照明关键字', 'Header 3': '注意事项'}),\n",
       " Document(page_content='## 控制区域照明  \\n提示中的照明关键字适用于整个图像。您可以进一步将灯光效果拨入图像的特定区域。', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '控制区域照明'}),\n",
       " Document(page_content='### 安装区域提示词扩展  \\n您将需要区域提示器扩展。\\n按照以下步骤在 AUTOMATIC1111 中安装区域提示器扩展。  \\n1. 正常启动 AUTOMATIC1111 Web-UI。\\n2. 导航到扩展页面。\\n3. 单击可用选项卡。\\n4. 单击加载自：按钮。\\n5. 找到扩展名“Regional Prompter”。\\n6. 单击安装。\\n7. 重新启动网络用户界面。  \\n在此示例中，您将对图像的上部和下部应用不同的照明。  \\n在 txt2img 页面中，展开区域提示符部分。  \\n```\\nActive: Yes\\nUse common prompt: Yes\\nSplit mode: Vertical\\nDivide Ratio: 2,3\\n```\\n单击“可视化并制作模板”以确认图像被分成两个垂直区域。  \\n输入提示\\n```\\n```\\n否定提示：\\n```\\n```\\n所有其他参数保持不变。  \\n您将得到一些顶部明亮但底部较暗的图像。  \\n现在尝试交换照明分配\\n```\\n```\\n灯光也会相应地交换。', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '控制区域照明', 'Header 3': '安装区域提示词扩展'}),\n",
       " Document(page_content='###  ControlNet 控制灯光\\n如今，任何教程如果不提及 ControlNet 都是不完整的……所以就开始吧！  \\n这种方法可以让您精确控制照明。  \\n您将需要安装 ControlNet 扩展。按照本教程进行安装。', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '控制区域照明', 'Header 3': 'ControlNet 控制灯光'}),\n",
       " Document(page_content='### TXT2IMG设置\\n1. 在txt2img页面上，照常生成图像。  \\n2. 选择要添加光照的图像。  \\n3. 将其保存到本地存储（稍后我们将在 ControlNet 中需要它）。  \\n4. 按发送到 img2img。  \\n5. Img2img 设置\\n您的提示、否定提示、图像大小和种子值现已移植到 img2img 页面。  \\n在img2img页面上，导航至 ControlNet 部分。  \\n将刚刚保存的图像上传到ControlNet Unit 0  \\n使用以下设置\\n```\\nEnable: Yes\\nPixel Perfect: Yes\\nAllow preview: Yes\\nControl Type: Depth\\nPreprocessor: depth_zoe\\nModel: control_xxxx_depth\\nControl Weight: 0.6\\n```  \\n6. 向上滚动到img2img 画布。删除图像。  \\n我们将使用下图来控制照明。该图像指定顶部附近的聚光灯。  \\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688481176506-90720858-4e41-4c83-b66b-d0b0786d9d06.png)  \\n调整亮度模式为“仅调整亮度”。  \\n将对比度强度设置为 0.95。  \\n点击“生成”按钮。  \\n预计您将获得一张顶部的光照图像。  \\n单击铅笔图标后，拖动突出显示区域的一角以调整大小。目前该工具存在一个错误。您可能需要执行两次。  \\n例如，下面的屏幕截图显示相同的图像被裁剪，以便光源位于左上角。\\n看到脸部和帽子的左侧比上一张图片亮得更多。\\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688481326495-b94e172f-6487-4700-824e-f9ef694fab75.png)  \\n同样，使用下面的光源从左下角照亮图像。  \\n或者更高对比度的对角光。  \\n![](https://test-1251830808.cos.ap-guangzhou.myqcloud.com/1688481334968-576bf15d-0896-41c8-aadc-198a87576eea.png)', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '控制区域照明', 'Header 3': 'TXT2IMG设置'}),\n",
       " Document(page_content='## 注意事项\\n1. 如果您发现Cotrolnet显示的颜色异常，请尝试减小其权重。\\n2. 调整去噪等级并观察相应的效果。', metadata={'Header 1': 'stable diffusion 控制光照的 3 种方法', 'Header 2': '注意事项'})]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "headers_to_split_on = [\n",
    "    (\"#\", \"Header 1\"),\n",
    "    (\"##\", \"Header 2\"),\n",
    "    (\"###\", \"Header 3\"),\n",
    "]\n",
    "\n",
    "markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on,strip_headers=False)\n",
    "md_header_splits = markdown_splitter.split_text(doc[0].page_content)\n",
    "md_header_splits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aa3f0370",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
